今天挑戰的是 Dom型的XSS,一樣是從 Low level 開始
我們會先看到這個頁面
打開 source code
我們發現他這裡沒有任何 php 的 code
那我們打開 F12 看看
這裡發現我們的選項欄預設的文字會是 default 參數的文字
像是如果 default 的參數改 123 會變成這樣
那我們把 default 的參數改成 payload 呢
XSS 成功!!!
看看 source code
他這裡把我們的 <script>
標籤過濾掉,並將 default 設為 English,而且 stripos
函數是不分大小寫的,所以這裡我們只能透過用其他標籤繞過的方式來做
可是如果我們直接打<img src="" onerror="alert(1)">
,他在前端寫的 javascript 會直接把我們的 payload 塞進 <option>
的標籤當中,但在<option>
標籤中是不能包含 <img>
標籤的,而且外面還有一層<select>
標籤,所以我們要關掉<option>
跟<select>
標籤
XSS 成功!!!
一樣看 source code
他這裡透過白名單的方式去檢查 default 參數的值,那這樣我們該怎麼繞過呢
為什麼可以用 #
來繞過 ?#
通常在 URL 中可以代表片段位置標誌,而不算在 GET 傳送資料的一部分,因此後端 PHP 不會接收到 #
之後的訊息,但前端部分仍然會進行解析而導致XSS漏洞
同理
因為後面的資料不算在 default 的參數內,所以不會被 PHP 處理
XSS 成功!!!
由前面的挑戰可知,通常 DOM 型的 XSS 漏洞都是因為前端沒有做好過濾而導致的,而在 Impossible 這個 level 將之前前端連結字串有一段 URL 解碼的部分直接去掉,這樣我們輸入的任何值都會經過URL編碼,進而可以避免XSS漏洞